package com.leyou.getway.config;


import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * @author 虎哥
 */
@Configuration
public class RateLimitConfig {
    //定义一个KeyResolver
    @Bean
    public KeyResolver ipKeyResolver() {
        return new KeyResolver() {
            @Override
            public Mono<String> resolve(ServerWebExchange exchange) {
                return Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
            }
        };
        // JDK8 的Lambda写法：
        // return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
    }
}

//三种生成令牌桶的格式
//- 给不同的请求URI路径设置不同令牌桶，示例代码：
//        return Mono.just(exchange.getRequest().getURI().getPath());// 获取请求URI
//        - 给不同的登录用户设置不同令牌桶
//        return exchange.getPrincipal().map(Principal::getName);// 获取用户
//        - 给不同的请求IP地址设置不同令牌桶
//        return Mono.just(exchange.getRequest().getRemoteAddress().getHostName());// 获取请求者IP
//
//        这里我们选择最后一种，使用IP地址的令牌桶key。